#include "RegistroDatos.h"
#include "../common/SerialInator.h"


RegistroDatos::RegistroDatos() : _posRelativa(-1), _reservado(0)
{
	this->clavePrimaria = "";
}


RegistroDatos::RegistroDatos(std::string clave, unsigned int posRel, unsigned short int res) :
		_posRelativa(posRel), _reservado(res)
{
	this->clavePrimaria = clave;
}


RegistroDatos::~RegistroDatos(){
	this->clavePrimaria = "";
	this->_posRelativa = -1;
	this->_reservado = 0;
}


RegistroDatos::RegistroDatos(const IRegistro& r){
	this->clavePrimaria = r.getClave();

	// Cuidado con esto para que no quede recursivo
	const RegistroDatos* rTemp = static_cast<const RegistroDatos*>(&r);
	this->_posRelativa = rTemp->getPosEnDiccionario();
	this->_reservado = rTemp->getReservado();
}


// Guarda en el arrBytes el contenido del registro
int RegistroDatos::serializar(char* arrBytes){
	SerialInator s;
	s.reset();

	// Una marca para separar los registros, es para debug
	s.serializar(arrBytes, '|');
	s.serializar(arrBytes, this->clavePrimaria);
	s.serializar(arrBytes, this->_posRelativa);
	s.serializar(arrBytes, this->_reservado);

	return s.getBufferSize();
}


// Extrae del arrBytes el contenido del registro
int RegistroDatos::desSerializar(char* arrBytes){
	SerialInator s;
	s.reset();

	char pipe = '|';	// Una marca para separar los registros, para debug
	s.desSerializar(arrBytes, pipe);
	s.desSerializar(arrBytes, this->clavePrimaria);
	s.desSerializar(arrBytes, this->_posRelativa);
	s.desSerializar(arrBytes, this->_reservado);

	return s.getBufferSize();
}


int RegistroDatos::getSize() const{
	int tam = sizeof(char); // La marca para debug

	tam += SerialInator::getSizeOf(this->clavePrimaria);
	tam += sizeof(this->_posRelativa) + sizeof(this->_reservado);

	return tam;
}


unsigned int RegistroDatos::getPosEnDiccionario() const{
	return this->_posRelativa;
}


void RegistroDatos::setPosEnDiccionario(unsigned int p){
	this->_posRelativa = p;
}


unsigned short int RegistroDatos::getReservado() const{
	return this->_reservado;
}


void RegistroDatos::setReservado(unsigned short int r){
	this->_reservado = r;
}


void RegistroDatos::ImprimirEn(std::ostream& out) const{
	out << "|(" << this->clavePrimaria.length() << ")"
			<< this->clavePrimaria << ","
			<< this->_posRelativa << ","
			<< this->_reservado;
}
